平成23年 秋期 基本情報技術者 午後 問09
問09 C言語次のCプログラムの説明及びプログラムを読んで,設問1,2に答えよ。 〔プログラム1の説明〕 二つの整数 x, y ( 0 < x < y )を受け取り,x / y の値を 10 進小数として出力するプログラムである。 (1) 関数 printRational の引数は,次のとおりである。ことで,引数の値に誤りはないものとする。
x: 分子を表す正の整数
ただし,x / y は有限小数(小数点以下の桁数が有限桁である小数)であり,循環小数(小数部のある桁以降で, 同じ数字の列が無限に繰り返される小数)ではないものとする。 (2) 次の手順で x / y を 10 進小数として出力する。 @ “0.”を出力する。 A x が 0 になるまで,次のB,Cを繰り返す。 B x を 10 倍した値を y で割った商を出力する。 C x を 10 倍した値を y で割った余りを新たに x とする。 〔プログラム1〕
(行番号) 1 #include <stdio.h> 2 void printRational(int, int); 3 void printRational(int x, int y) { 4 putchar('0'); 5 putchar('.'); 6 while (x > 0) { 7 putchar('0' + (x * 10 / y)); 8 x = x * 10 % y; 9 } 10 putchar('\n'); 11 } 設問1 次の記述中の に入れる正しい答えを,解答群の中から選べ。 (1) プログラム1の行番号7では小数点以下の各桁の数字を出力している。 この行を“putchar('0' + (x / y + 10));”に変えると 。 (2) printRational(3,8) を実行した場合,行番号6の条件判定が2回目に行われるときの x の値は であり,プログラムが終了するまでに,行番号6の条件判定は 回行われる。 a に関する解答群
イ 乗算が除算よりも先に実行され,正しい値が出力されない ウ 除算が乗算よりも先に実行されるが,正しい値が出力される エ 除算が乗算よりも先に実行され,正しい値が出力されない b,c に関する解答群
カ 5 キ 6 ク 7 ケ 8 コ 9
設問2 次の説明を読み,プログラム2中の に入れる正しい答えを, 解答群の中から選べ。 x / y が循環小数となる x と y を引数に指定して関数 printRational を実行した場合,ある桁以降で同じ数字の列を 無限に繰り返し出力し続け,プログラムは終了しない。この繰り返し出力される同じ数字の列を循環節と呼ぶ。 最初に現れる循環節を“ [ ”と“ ] ”で囲んで出力するプログラムを作成した。 〔プログラム2の説明〕 (1) 関数 recurringDecimal の引数は,次のとおりである。ここで,引数に誤りはないものとする。 x: 分子を表す正の整数(2) x / y の値によって次のように場合分けを行い,それぞれ別の様式の小数点数を出力する。 @ 小数点以下 100 桁までに割り切れる場合 小数点数をそのまま出力する。例えば,recurringDecimal(1, 8) を実行した場合,次のように出力する。 0.125A 小数点以下 100 桁までの間に循環節がある場合 最初の循環節の直前までの小数点数を出力し,その後に循環節の数字の列を“ [ ”と“ ] ”で囲んで出力する。 例えば,recurringDecimal(3,22) を実行した場合,次のように出力する。 0.1[36] B その他の場合 小数点以下 100 桁までの小数点数を出力し,その後に“…”を続けて出力する。例えば, recurringDecimal(19,131) を実行した場合,次のように出力する。 0.1450381679389312977099236641221374045801526717557251908 396946564885496183206106870229007633587736259... (3) 関数 recurringDecimal は,x / y の値によって出力様式を決める部分と小数点数を出力する部分の 二つに分かれている。 (4) x / y の値によって出力様式を決める手順は,次のとおりである。 @ 大きさ 100 の配列 xHistory と変数 ri を用意する。 A ri を 0 とする。 B xHistory[ri] に x を格納し,ri を1増やす。 C x を 10 倍した値を y で割った余りを新たに x とする。 D x が 0 になった場合,出力様式は (2) の@とする。 E x と同じ値をもつ xHistory[i] ( 0 ≦ i < ri ) があるかどうかを調べる。 F 同じ値をもつものがある場合,出力様式は (2) のAとする。このとき,x / y の値の 小数点以下第 i+1 位から第 ri 位までの数字の列が最初の循環節となる。 G 同じ値をもつものがない場合,ri が 100 以上であれば出力様式は (2) の Bとする。 そうでなければ,Bに戻る。 〔プログラム2〕 #include <stdio.h> #define DIGITMAX 100 /* 出力する小数点以下の最大桁数 */ void recurringDecimal(int, int); void recurringDecimal(int x, int y) { int xHistory[DIGITMAX]; int i, ri = 0, startRepeat = -1; /* 出力様式の決定 */ while ((x > 0) && (ri < DIGITMAX) && ( )) { xHistory[ri] = x; ri++; x = x * 10 % y; for (i = 0; ; i++) { if (xHistory[i] == x) { startRepeat = i; } } } /* 小数点数の出力 */ putchar('0'); putchar('.'); for (i = 0; i < ri; i++) { if( ) { putchar('['); } putchar( ); } if (startRepeat >= 0){ putchar(']'); } else { if ((ri >= DIGITMAX) && ( x > 0)){ putchar('.'); putchar('.'); putchar('.'); } } putchar('\n'); } d,e に関する解答群
ウ i < ri エ i >= 0 オ ri < DIGITMAX カ ri > 0 キ startRepeat == -1 ク startRepeat >= 0 ケ startRepeat > i f に関する解答群
ウ i == startRepeat - 1 エ i < startRepeat オ startRepeat < 0 カ startRepeat >= 0
g に関する解答群
イ xHistory[i] * 10 / y ウ xHistory[ri] * 10 / y エ xHistory[startRepeat] * 10 / y オ '0' + x * 10 / y カ '0' + xHistory[i] * 10 / y キ '0' + xHistory[ri] * 10 / y ク '0' + xHistory[startRepeat] * 10 / y
[←前の問題] [次の問題→] [問題一覧表] [分野別] [基本情報技術者試験TOP ]
©2004-2024 情報処理試験.jp
|
プライバシーポリシー・著作権・リンク
|
お問合わせ
|